API Gateway

Önce API(Application Program Interface)'ın kısa tanımını yapalım. Bir programa başka bir programın ne şekilde ulaşabileceğinin tanımlandığı iletişim yöntemine verilen isimdir. Yani bir programa her zaman bir insan ulaşmaz klavye, mouse olmadan başka bir program da hali hazırdaki programlara erişmesi gerekebilir. Restoranda bulunan garsona benzetebiliriz. Müşteriler istekleri direk mutfağa iletmezler bir aracıya ihtiyaç duyulur tüm istekler toplanıp mutfağa iletilir. Mutfaktan da doğru yemekler doğru müşteriye garson tarafından getirilir. Bu işi yazılım dünyasında yapan garson API olmuş oluyor.

API Gateway konusuna gelince, microservis yapılarının yaygınlaşmasıyla bir servis bir çok servis ile iletişime geçmek durumunda kalabildi. Aşağıdaki resimden anlaşılacağı üzere bağlı tüm servislere ortak erişilebilecek API sağlayan API Gateway kullanmamız gerekiyor. Tüm uygulamalar isteklerini API Gateway'e iletir, o da cevapları doğru uygulamaya gönderir.

API Gateway'de Güvenlik

Bu başlıkta güvenlik için kullanılan 3 konudan bahsedeceğim.

1- IAM Permissions: API'a kullanıcı veya oluşturulan rol ile erişim yapılmaktadır. Bu erişimin kontorlünü de API Gateway yapmaktadır.

2- Lambda Authorizer: 3. parti uygulamaların token ile erişim kontrolleri Lambda Authorizer ile gerçekleştirilir.

3- Cognito User Pools: Cognito aslında yetkilendirmeye değil kimlik kontrolü yaparak doğrulamaya yardımcı olur.

API Gateway ile uygulamalar arasında çift yönlü iletişim sağlanabilir. Bunun için AWS'de 3 farklı tipte API vardır. HTTP API, REST API ve WebSocket API. Şimdi konsola geçelim. Arama çubuğuna API Gateway yazalim.

Rest API'yi kendi VPC içinde de kullanabiliriz bu durumda adı Private olmuş olacak. HTTP API hariç diğerleri Lambda, HTTP backend ve Diğer AWS servisleriyle entegreli çalışabilir.

Kısaca farklarına bakalım. HTTP API basit, daha ucuz ve hızlı bir seçenek REST API'ye nazaran. WEBSOCKET ise daha farklı burada gerçek zamanlı bir aktarım söz konusu. HTTP ve REST'de GET, PULL gibi istek geldiğinde sonuç dönerken WEBSOCKET'de çift yönlü sürekli bir akış olmakta.

Biz Rest API örneği yapacağız. Basit bir örnek olacak daha önceki yazımda - yaptığım rastgele sayı üretme fonksiyonunu kullanacağım. Bittiğinde bu API'a ulaşmak isteyenlere rastgele sayı döndürecek. Lambda fonksiyonunu burada paylaşayım.

import random
def lambda_handler(event, context):
    # TODO implement
    sayi = random.randint(0,100)
    return sayi

Build diyelim.

Protokol olarak REST seçtik. Hemen altında yeni API, örnek API veya daha önce hazırlanmış API'ı yükleme seçenekleri var. New API seçtik. Setting kısmında da regional seçerek oluşturduğumuz regionda çalışmasını isteyeceğiz. İstersek CloudFront ile Edge locationlardan kullanabilir veya VPC içi private bir API oluşturabilirdik. Create API'a tıklayalım.

Açılan sayfada açtion menüsünden Create resource'a tıklayalım. Burada şunu yapacağız. root sayfada değilde diğer pathleri oluşturmuş olacağız. Bittiğinde göreceğiz ne yaptığımızı en son denerken verdiğimiz path ile deneyeceğiz. Ban aşağıdaki gibi girdim. Create Resource diyelim.

Şimdi aynı action menüsünden create method ile bir method oluşturalım, GET methodunu seçelim ve yanındaki tik işaretine tıklayalım.

Biz başlangıçta Lambda kullanacağımızı belirtmiştik. Burada HTTP seçip end point URL vererek de uygulayabiliriz. Başka bir AWS kaynağı seçebiliriz. En altta da rastgele sayı üreten lambda fonksiyonumu seçtim. Save diyelim.

Dikkat ettiyseniz bu lambdayı oluştururken herhangi bir kaynağa yetki vermemiştik. API Gatewayde save dediğimizde Lambdaya yetki vereceksin onaylıyor musun diye soracak.

Yukarıdaki resimde ne yapacağını gösteriyor. İstek geldiğinde Lambda'ya iletecek Lambda çalışıp sonuç döndürecek. Test edelim. Çalıştığını gördükten sonra Action menüsünden deplay edelim.

Açılan sayfada yeni bir stage oluşturalım ve isim verelim.

Yukarıdaki gibi bir URL çıkacak. Tıklayalım ve istediğimize ulaşamadığımızı görelim 🙂 URL in sonuna /rastgele yazmamız gerekecek. Yukarıda bahsetmiştim create resource ile yapmıştık.

API Gateway'in verdiği URL'de stage ismi de olacak ben development girmiştim./rastgele eklediğim kısım ve sonuç 42 gele gele Konya geldi 😂